package servidor.so;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.List;

import comum.rn.RNDescricaoSalaJogo;
import comum.rn.RNEstatisticas;
import comum.rn.RNInfoSalaJogo;
import comum.rn.RNJogada;
import comum.rn.RNPeca;
import comum.so.SOServidorEntrada;
import comum.so.SOClienteEntrada;
import comum.so.exception.FalhaComunicacaoBancoDadosException;
import comum.so.exception.FalhaValidacaoException;
import comum.so.exception.JaExistePerfilCadastradoComEsseLoginException;
import comum.so.exception.LoginEmUsoException;
import comum.so.exception.SalaCheiaException;
import comum.so.exception.SalaComNomeJaExistenteException;
import comum.so.exception.SalaNaoExisteException;
import comum.so.exception.SenhaIncorretaException;

public class SOServidorEntradaImpl extends UnicastRemoteObject implements
		SOServidorEntrada {
	private static final long serialVersionUID = 8098563756443729031L;

	private SOServidorSaida servidorSaida;

	public SOServidorEntradaImpl(SOServidorSaida servidorSaida)
			throws RemoteException {
		super();
		this.setServidorSaida(servidorSaida);
	}

	@Override
	public void fazerLogin(String identificador, String senha,
			SOClienteEntrada clienteEntrada) throws RemoteException,
			FalhaValidacaoException, LoginEmUsoException,
			FalhaComunicacaoBancoDadosException {
		getServidorSaida().fazerLogin(identificador, senha, clienteEntrada);
	}

	@Override
	public void cadastrarNovoPerfil(String identificador, String senha,
			SOClienteEntrada clienteEntrada) throws RemoteException,
			JaExistePerfilCadastradoComEsseLoginException {
		getServidorSaida().cadastrarNovoPerfil(identificador, senha, clienteEntrada);
	}

	@Override
	public void deslogar(String identificador) throws RemoteException {
		getServidorSaida().deslogar(identificador);
	}

	@Override
	public List<RNDescricaoSalaJogo> buscarSalasJogo(boolean mostrarCheios,
			boolean mostrarComSenha) throws RemoteException {
		return getServidorSaida().buscarSalasJogo(mostrarCheios, mostrarComSenha);
	}

	@Override
	public RNInfoSalaJogo entrarSalaJogo(String identificador, Long idSalaJogo,
			String senha) throws RemoteException, SalaCheiaException,
			SalaNaoExisteException, SenhaIncorretaException {
		return getServidorSaida().entrarSalaJogo(identificador, idSalaJogo, senha);
	}

	@Override
	public RNInfoSalaJogo criarSalaJogo(String nome, String senha,
			String identificador) throws RemoteException,
			SalaComNomeJaExistenteException {
		return getServidorSaida().criarSalaJogo(nome, senha, identificador);
	}

	@Override
	public RNEstatisticas obterEstatisticas(String identificador)
			throws RemoteException {
		return getServidorSaida().obterEstatisticas(identificador);
	}

	@Override
	public void sairSalaEspera(Long idSalaJogo, String identificador)
			throws RemoteException {
		getServidorSaida().sairSalaEspera(idSalaJogo, identificador);

	}

	@Override
	public boolean entrarMesa(int posicaoDesejada, Long idSalaJogo,
			String identificador) throws RemoteException {
		return getServidorSaida().entrarMesa(posicaoDesejada, idSalaJogo,
				identificador);
	}

	@Override
	public void sairMesa(Long idSalaJogo, String identificador)
			throws RemoteException {
		getServidorSaida().sairMesa(idSalaJogo, identificador);

	}

	@Override
	public void fazerJogada(String jogadorQueJogou, Long idSalaJogo,
			RNJogada jogada) throws RemoteException {
		getServidorSaida().fazerJogada(jogadorQueJogou, idSalaJogo, jogada);
	}

	@Override
	public void desistirJogo(Long idSalaJogo, String identificador)
			throws RemoteException {
		getServidorSaida().desistirJogo(idSalaJogo, identificador);

	}

	@Override
	public void informarFimPartida(String jogadorRecebe, String mensagem)
			throws RemoteException {
		getServidorSaida().informarFimPartida(jogadorRecebe, mensagem);

	}

	@Override
	public void informarMudancaMesa(String jogadorRecebe, Integer[] posicoesMesa)
			throws RemoteException {
		getServidorSaida().informarMudancaMesa(jogadorRecebe, posicoesMesa);
	}

	@Override
	public void informarJogada(String jogadorQueRecebe, String jogadorQueJogou,
			RNJogada jogada, String novoJogadorEmTurno) throws RemoteException {
		getServidorSaida().informarJogada(jogadorQueRecebe, jogadorQueJogou, jogada,
				novoJogadorEmTurno);
	}

	@Override
	public void informarInicioPartida(String jogadorQueRecebe,
			List<RNPeca> pecas, String primeiroAJogar) throws RemoteException {
		getServidorSaida().informarInicioPartida(jogadorQueRecebe, pecas, primeiroAJogar);
	}

	@Override
	public void iniciarPartida(Long idSalaJogo) throws RemoteException {
		getServidorSaida().iniciarPartida(idSalaJogo);

	}

	@Override
	public void informarSaidaJogador(String jogadorRecebe,
			String jogadorQueSaiu, RNInfoSalaJogo infoSalaJogo)
			throws RemoteException {
		getServidorSaida().informarSaidaJogador(jogadorRecebe, jogadorQueSaiu,
				infoSalaJogo);

	}

	// Servidor informando a entrada de um novo jogador e atualizando RNSala
	@Override
	public void informarEntradaJogador(String jogadorRecebe,
			String jogadorQueEntrou, RNInfoSalaJogo infoSalaJogo)
			throws RemoteException {
		getServidorSaida().informarEntradaJogador(jogadorRecebe, jogadorQueEntrou,
				infoSalaJogo);

	}

	protected SOServidorSaida getServidorSaida() {
		return servidorSaida;
	}
	
	protected void setServidorSaida(SOServidorSaida servidorSaida) {
		this.servidorSaida = servidorSaida;
	}

}
